package com.rengwuxian.coursecoroutines._1_basics

import android.os.Bundle
import android.widget.TextView
import androidx.activity.ComponentActivity
import androidx.lifecycle.lifecycleScope
import com.rengwuxian.coursecoroutines.R
import com.rengwuxian.coursecoroutines.common.gitHub
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlin.concurrent.thread

/**
 * 回到线程世界：runBlocking()
 * 线程、main()、suspend、coroutineScope()
 *
 * 协程自带的启动协程的函数有三个：
 * launch
 * async -》await
 * runBlocking ：
 *    有两点特殊：
 *        1.不需要CoroutineScope,因为runBlocking不需要CoroutineScope的两个作用。
 *        2.会阻塞当前线程，直到它运行结束。而launch和async是不会的（除非特殊情况，Dispatchers.Main.immediate）
 *    原因：特殊的定位：把挂起函数代码转换程阻塞式代码，让传统的线程式API使用。和上一节课相反。
 *    从协程世界回到阻塞式的线程世界。
 *
 *
 * CoroutineScope的作用：
 * 1.提供很多协程需要的CoroutineContext，比如ContinuationInterceptor，知道自己运行在什么线程
 * 2.提供后续对协程的取消的功能。CoroutineScope(Dispatchers.Main).cancel()
 *
 * runBlocking让协程回到线程世界的封装写法：
 *   private fun blockingContributors() = runBlocking {
 *     gitHub.contributors("square", "retrofit")
 *   }
 *
 *   fun main() = runBlocking<Unit> {
 *   val contributors = gitHub.contributors("square", "retrofit")
 *   launch {
 *
 *   }
 *  }
 *  能包住整个main代码块，来提供一个协程的环境。
 *
 *  还平时用在测试代码中。
 *
 * coroutineScope {
 * }
 * 是什么？它是给你的协程提供内部的结构化并发支持的函数。
 */
fun main() = runBlocking<Unit> {
  val contributors = gitHub.contributors("square", "retrofit")
  launch {

  }
}

class RunBlockingActivity : ComponentActivity() {
  private lateinit var infoTextView: TextView

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.layout_1)
    infoTextView = findViewById(R.id.infoTextView)

    lifecycleScope.launch(Dispatchers.Main.immediate) {

    }
    println()
    lifecycleScope.async { }
    blockingContributors()
    println()
  }

  private fun blockingContributors() = runBlocking {
    gitHub.contributors("square", "retrofit")
  }

}